filechooserdialog: Be more careful with widgets
authorMatthias Clasen <mclasen@redhat.com>
Mon, 11 May 2020 18:23:58 +0000 (14:23 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 11 May 2020 18:23:58 +0000 (14:23 -0400)
We were stepping on our own toes, by first setting
up a save entry and telling the filechooserwidget
about it, and then nuking it by setting a title
on the headerbar. The filechooserwidget wasn't
ready for the entry to die without anybody telling
it.

This fixes a crash when using the filechooser for
print-to-file in the print dialog.

gtk/gtkfilechooserdialog.c

index 4f5e9f6ca4cf9bd485ba8765fe746aeb3ba0d820..c6c7b9b22ed2b245dff02a97b259492ebc885706 100644 (file)
@@ -476,38 +476,41 @@ setup_search (GtkFileChooserDialog *dialog)
                               priv->widget, "search-mode",
                               G_BINDING_BIDIRECTIONAL);
 
-      box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-      gtk_widget_set_valign (box, GTK_ALIGN_CENTER);
-
-      label = gtk_label_new (NULL);
-      gtk_widget_set_halign (label, GTK_ALIGN_CENTER);
-      gtk_label_set_single_line_mode (GTK_LABEL (label), TRUE);
-      gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
-      gtk_label_set_width_chars (GTK_LABEL (label), 5);
-      gtk_widget_add_css_class (label, GTK_STYLE_CLASS_TITLE);
-      gtk_widget_set_parent (label, box);
-
-      g_object_bind_property (dialog, "title",
-                              label, "label",
-                              G_BINDING_SYNC_CREATE);
-
-      label = gtk_label_new (NULL);
-      gtk_widget_set_halign (label, GTK_ALIGN_CENTER);
-      gtk_label_set_single_line_mode (GTK_LABEL (label), TRUE);
-      gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
-      gtk_widget_add_css_class (label, GTK_STYLE_CLASS_SUBTITLE);
-      gtk_widget_set_parent (label, box);
-
-      g_object_bind_property (priv->widget, "subtitle",
-                              label, "label",
-                              G_BINDING_SYNC_CREATE);
-      g_object_bind_property_full (priv->widget, "subtitle",
-                                   label, "visible",
-                                   G_BINDING_SYNC_CREATE,
-                                   translate_subtitle_to_visible,
-                                   NULL, NULL, NULL);
-
-      gtk_header_bar_set_title_widget (GTK_HEADER_BAR (header), box);
+      if (!priv->has_entry)
+        {
+          box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+          gtk_widget_set_valign (box, GTK_ALIGN_CENTER);
+
+          label = gtk_label_new (NULL);
+          gtk_widget_set_halign (label, GTK_ALIGN_CENTER);
+          gtk_label_set_single_line_mode (GTK_LABEL (label), TRUE);
+          gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+          gtk_label_set_width_chars (GTK_LABEL (label), 5);
+          gtk_widget_add_css_class (label, GTK_STYLE_CLASS_TITLE);
+          gtk_widget_set_parent (label, box);
+
+          g_object_bind_property (dialog, "title",
+                                  label, "label",
+                                  G_BINDING_SYNC_CREATE);
+
+          label = gtk_label_new (NULL);
+          gtk_widget_set_halign (label, GTK_ALIGN_CENTER);
+          gtk_label_set_single_line_mode (GTK_LABEL (label), TRUE);
+          gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+          gtk_widget_add_css_class (label, GTK_STYLE_CLASS_SUBTITLE);
+          gtk_widget_set_parent (label, box);
+
+          g_object_bind_property (priv->widget, "subtitle",
+                                  label, "label",
+                                  G_BINDING_SYNC_CREATE);
+          g_object_bind_property_full (priv->widget, "subtitle",
+                                       label, "visible",
+                                       G_BINDING_SYNC_CREATE,
+                                       translate_subtitle_to_visible,
+                                       NULL, NULL, NULL);
+
+          gtk_header_bar_set_title_widget (GTK_HEADER_BAR (header), box);
+        }
 
       gtk_container_forall (GTK_CONTAINER (header), add_button, dialog);
     }